package com.example.UI.database;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

import androidx.annotation.Nullable;

import com.example.UI.entity.Course;
import com.google.firebase.firestore.auth.User;
import java.util.ArrayList;
import java.util.List;

/**
 * 继承自SQLiteOpenHelper的类，用于帮助创建、管理和版本控制数据库。
 */
public class CourseMessage extends SQLiteOpenHelper {
    // 数据库名称
    private static final String DB_NAME = "schools";
    // 数据库版本
    private static final int DB_Version = 1;

    /**
     * 构造函数，接收上下文环境。
     *
     * @param context 上下文环境，通常传入当前的Activity或Application。
     */
    public CourseMessage(@Nullable Context context) {
        super(context, DB_NAME, null, DB_Version);
    }

    /**
     * 当数据库第一次被创建时调用，用于创建数据库表。
     *
     * @param db SQLiteDatabase对象，用于执行SQL语句。
     */
    @Override
    public void onCreate(SQLiteDatabase db) {
        // 创建名为courses的表，包含五个字段。
        String CREATE_TABLE = "CREATE TABLE courses (" +
                "courseName TEXT NOT NULL ," +
                "courseId TEXT PRIMARY KEY ," +
                "courseTeacher TEXT NOT NULL ," +
                "courseClass TEXT ," +
                "courseTime INT )";
        db.execSQL(CREATE_TABLE); // 执行SQL语句创建表
    }

    /**
     * 当数据库需要升级时调用，用于处理数据库版本更新。
     *
     * @param db         SQLiteDatabase对象。
     * @param oldVersion 旧的数据库版本号。
     * @param newVersion 新的数据库版本号。
     */
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // 删除旧的表，并调用onCreate重新创建表。
        db.execSQL("DROP TABLE IF EXISTS courses");
        onCreate(db);
    }

    /**
     * 获取数据库中所有课程信息。
     *
     * @return 返回包含所有课程的List<Course>对象。
     */
    public List<Course> getAllCourses() {
        SQLiteDatabase db = this.getReadableDatabase();
        List<Course> courses = new ArrayList<>();
        String[] columns = {"courseName", "courseId", "courseTeacher", "courseClass", "courseTime"};
        Cursor cursor = null;
        try {
            cursor = db.query("courses", columns, null, null, null, null, null);
            if (cursor != null) {
                // 遍历Cursor对象，并将每一行数据转换为Course对象后添加到List中。
                while (cursor.moveToNext()) {
                    String courseName = cursor.getString(cursor.getColumnIndex("courseName"));
                    String courseId = cursor.getString(cursor.getColumnIndex("courseId"));
                    String courseTeacher = cursor.getString(cursor.getColumnIndex("courseTeacher"));
                    String courseClass = cursor.getString(cursor.getColumnIndex("courseClass"));
                    int courseTime = cursor.getInt(cursor.getColumnIndex("courseTime"));
                    Course course = new Course(courseName, courseId, courseTeacher, courseClass, courseTime);
                    courses.add(course);
                }
            }
        } catch (Exception e) {
            // 若查询过程中发生异常，打印错误日志。
            Log.e("CourseMessage", "Error retrieving all courses", e);
        } finally {
            // 确保Cursor和数据库被正确关闭。
            if (cursor != null) {
                cursor.close();
            }
            db.close();
        }
        return courses; // 返回包含所有课程信息的List。
    }

    /**
     * 向数据库添加一个新的课程。
     *
     * @param course 要添加的Course对象。
     * @return 返回新行的行ID，若添加失败则返回-1。
     */
    public long addCourse(Course course) {
        long newRowId = -1; // 默认值，表示添加失败
        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues contentValues = new ContentValues();
        try {
            // 使用ContentValues对象存储要插入的数据。
            contentValues.put("courseName", course.getCourseName());
            contentValues.put("courseId", course.getCourseId());
            contentValues.put("courseTeacher", course.getCourseTeacher());
            contentValues.put("courseClass", course.getCourseClass());
            contentValues.put("courseTime", course.getCourseTime());
            // 将数据插入到courses表中。
            newRowId = db.insert("courses", null, contentValues);
        } catch (Exception e) {
            // 打印异常堆栈。
            e.printStackTrace();
        } finally {
            // 确保数据库被关闭。
            db.close();
        }
        return newRowId;
    }
}